﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Model.Produtos;

namespace welwitschia.Produtos
{
    public partial class GrupoProdutoDetalhe : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                GrupoProduto grupoProduto = null;
                GrupoProduto grupoProdutoPai = null;
                String codGrupoProdutoPai = String.Empty;
                IGrupoProdutoService grupoProdutoService = new GrupoProdutoService();
                if (!String.IsNullOrEmpty(Request.QueryString["codgpp"]))
                {
                    grupoProdutoPai = grupoProdutoService.ObterPorCodGrupoProduto(Request.QueryString["codgpp"]);
                    codGrupoProdutoPai = grupoProdutoPai.CodGrupoProduto;
                    btnSubGrupo.Enabled = false;
                    hfModo.Value = "Novo";
                }
                else if (!String.IsNullOrEmpty(Request.QueryString["codgp"]))
                {
                    grupoProduto = grupoProdutoService.ObterPorCodGrupoProduto(Request.QueryString["codgp"]);
                    txtCodGrupoProduto.Text = grupoProduto.CodGrupoProduto;
                    txtNome.Text = grupoProduto.Nome;
                    txtDescricao.Text = grupoProduto.Descricao;
                    if(grupoProduto.GrupoPai!=null)
                        codGrupoProdutoPai = grupoProduto.GrupoPai.CodGrupoProduto;

                    lvGrupos.DataSource = grupoProdutoService.ObterGruposFilhoPorCodGrupoProduto(grupoProduto.CodGrupoProduto);
                    lvGrupos.DataBind();
                    hfModo.Value = "Edicao";
                }
                else
                {
                    LimpaDadosForm();
                    btnSubGrupo.Enabled = false;
                    hfModo.Value = "Novo";
                }

                ddlGrupoPai.DataTextField = "Nome";
                ddlGrupoPai.DataValueField = "CodGrupoProduto";
                ddlGrupoPai.DataSource = grupoProdutoService.ObterTodos();
                ddlGrupoPai.DataBind();

                if (codGrupoProdutoPai != String.Empty)
                {
                    ddlGrupoPai.SelectedValue = codGrupoProdutoPai;
                    BindTreeViewFamilias(codGrupoProdutoPai);
                }
                else
                {
                    BindTreeViewFamilias(null);
                }

                ddlGrupoPai.Items.Insert(0, new ListItem() { Text = String.Empty, Value = "-1000" });
            }
        }

        protected void btnSubGrupo_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~\Produtos\GrupoProdutoDetalhe.aspx?codgpp=" + txtCodGrupoProduto.Text);
        }

        protected void btnGravar_Click(object sender, EventArgs e)
        {
            GrupoProdutoService grupoProdutoService = new GrupoProdutoService();
            GrupoProduto grupoProduto = new GrupoProduto();
            grupoProduto.CodGrupoProduto = txtCodGrupoProduto.Text.Trim();
            grupoProduto.Nome = txtNome.Text.Trim();
            grupoProduto.Descricao = txtDescricao.Text.Trim();
            if (ddlGrupoPai.SelectedIndex > 0)
                grupoProduto.GrupoPai = new GrupoProduto() { CodGrupoProduto = ddlGrupoPai.SelectedValue };

            if(hfModo.Value == "Novo")
                grupoProdutoService.Insere(grupoProduto);
            else
                grupoProdutoService.Actualiza(grupoProduto);

            Response.Redirect(@"~\Produtos\GrupoProdutoLista.aspx");
        }

        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~\Produtos\GrupoProdutoLista.aspx");
        }

        private void LimpaDadosForm()
        {
            txtCodGrupoProduto.Text = String.Empty;
            txtNome.Text = String.Empty;
            txtDescricao.Text = String.Empty;
        }

        protected void lvGrupos_ItemDeleting(object sender, ListViewDeleteEventArgs e)
        {
            IGrupoProdutoService grupoProdutoService = new GrupoProdutoService();
            grupoProdutoService.Apaga(new GrupoProduto() { CodGrupoProduto = e.Keys["CodGrupoProduto"].ToString() });
        }

        protected void lvGrupos_ItemEditing(object sender, ListViewEditEventArgs e)
        {
        }

        protected void lvGrupos_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "Edit")
                Response.Redirect(@"~\Produtos\GrupoProdutoDetalhe.aspx?codgp=" + e.CommandArgument.ToString());
        }

        private Dictionary<String, TreeNode> _idxTreeView = new Dictionary<String, TreeNode>();


        private void BindTreeViewFamilias(String codGrupoProduto)
        {
            tvFamiliaProduto.Nodes.Clear();

            IGrupoProdutoService grupoProdutoService = new GrupoProdutoService();
            IList<GrupoProduto> grupoProdutos = grupoProdutoService.ObterTodos();

            IEnumerable<GrupoProduto> found = grupoProdutos.Where<GrupoProduto>(e => e.GrupoPai == null);
            foreach (GrupoProduto gp in found)
            {
                AddNode(gp, codGrupoProduto);
            }

            found = grupoProdutos.Where<GrupoProduto>(e => e.GrupoPai != null);
            foreach (GrupoProduto gp in found)
            {
                AddNode(gp, codGrupoProduto);
            }
        }

        private void AddNode(GrupoProduto grupoProduto, String codGrupoProduto)
        {
            TreeNode node = new TreeNode();
            node.Text = grupoProduto.Nome;
            node.Value = grupoProduto.CodGrupoProduto;
            if (!String.IsNullOrEmpty(codGrupoProduto))
            {
                if (codGrupoProduto == grupoProduto.CodGrupoProduto)
                    node.Select();
            }
            _idxTreeView.Add(grupoProduto.CodGrupoProduto, node);

            if (grupoProduto.GrupoPai != null)
            {
                TreeNode nodePai = _idxTreeView[grupoProduto.GrupoPai.CodGrupoProduto];
                nodePai.ChildNodes.Add(node);
            }
            else
            {
                tvFamiliaProduto.Nodes.Add(node);
            }
        }

        protected void tvFamiliaProduto_SelectedNodeChanged(object sender, EventArgs e)
        {
            ddlGrupoPai.SelectedValue = tvFamiliaProduto.SelectedValue;
        }
    }
}